import os
import re

# 设置要处理的文件夹路径和前缀
folder_path = "/Users/admin/Desktop/Test_1/Test"  # 请替换为你想要处理的文件夹路径
# 请替换为你想要添加的前缀
prefix = "KFC"
# 方法名前缀
func_prefix = "kfc_"
# 白名单文件列表，包含不需要修改的文件名
whitelist = ["AppDelegate.swift"]  # 请替换为实际的白名单文件名
# 方法白名单
func_whitelist = ["DisposeBag","UI","CA","CG","Data"]

def rename_files(folder_path, prefix, whitelist):
    # 遍历文件夹中的所有文件
    for dirpath, _, filenames in os.walk(folder_path):
        for filename in filenames:
            if filename.endswith(".swift"):  # 只处理 .swift 文件
                if filename in whitelist:  # 如果文件名在白名单中，跳过
                    print(f"跳过文件: {filename} (在白名单中)")
                    continue
                old_file = os.path.join(dirpath, filename)
                new_file = os.path.join(dirpath, prefix + filename)
                print(f"文件名已更改: {old_file} -> {new_file}")
                # 重命名文件
                os.rename(old_file, new_file)
            
                # 存储去除后缀的文件名映射
                old_basename = filename[:-6]  # 去掉 .swift 后缀
                new_basename = prefix + filename[:-6]  # 去掉后缀并加上前缀
                
                # 更新文件引用
                update_references(folder_path, old_basename, new_basename)
                
# 替换项目中所有文件中旧文件名的引用
def update_references(folder_path, old_filename, new_filename):
    # 定义匹配各种引用的正则表达式
    pattern = re.compile(r'\b' + re.escape(old_filename) + r'\b')
    tempName = re.escape(old_filename)
    
    for root, _, files in os.walk(folder_path):
        for file in files:
            if file.endswith(('.swift', '.h','.m')):  # 根据需要修改文件类型
                file_path = os.path.join(root, file)
                print(f"file_path:{file_path}")
                with open(file_path, 'r', encoding='utf-8') as f:
                    content = f.read()

                 # 检查文件是否包含需要替换的旧文件名
    
                if pattern.search(content):
                    print(f"更新引用: {file_path} 中的 {old_filename} 为 {new_filename}")
                    # 替换所有匹配的文件名
                    file_content = pattern.sub(new_filename, content)

                    # 将更新后的内容写回文件
                    with open(file_path, 'w', encoding='utf-8') as file:
                        file.write(file_content)
        
### 添加方法前缀
def add_prefix_to_methods(folder_path, prefix, whitelist):
    # 正则表达式匹配 Swift 方法定义（适用于常见情况，可能需要根据具体代码格式调整）
    method_pattern = re.compile(r'\bfunc\s+([a-zA-Z_][a-zA-Z0-9_]*)\s*\(')
    call_pattern = re.compile(r'\b([a-zA-Z_][a-zA-Z0-9_]*)\s*\(')  # 匹配方法调用
    
    # 遍历文件夹中的所有文件
    for root, _, files in os.walk(folder_path):
        for file in files:
            if file.endswith(('.swift', '.h','.m')):  # 根据需要修改文件类型
                file_path = os.path.join(root, file)
                # 读取 Swift 文件内容
                with open(file_path, 'r', encoding='utf-8') as file:
                    content = file.read()

                # 在文件中查找所有方法名并加前缀
                def replace_method_name(match):
                    method_name = match.group(1)
                    # 如果方法是系统方法或者在白名单中，则不加前缀
                    if method_name in whitelist or is_system_method(method_name):
                        return match.group(0)  # 返回原始方法名
                    
                    # 否则，给方法名加上前缀
                    print(f"修改方法名: {method_name}")  # 打印出修改的函数名
                    return match.group(0).replace(method_name, prefix + method_name)
                
                # 替换方法名
                new_content = re.sub(method_pattern, replace_method_name, content)
                
                 # 替换方法调用
                new_content = re.sub(call_pattern, replace_method_name, new_content)
                # 将修改后的内容写回文件
                with open(file_path, 'w', encoding='utf-8') as file:
                    file.write(new_content)
                    
# 判断是否是系统方法（基于前缀进行简单判断）
def is_system_method(method_name):
    system_prefixes = ["view", "tableView", "webView", "application", "init","scrollView"]  # 根据需要加入更多系统前缀
    return any(method_name.startswith(prefix) for prefix in system_prefixes)
                
                    
renamed_files = rename_files(folder_path,prefix,whitelist)
#add_prefix_to_methods(folder_path,func_prefix,func_whitelist)
print("所有文件处理完毕！")
